import { Component, OnInit } from '@angular/core';
import { THIS_EXPR } from '@angular/compiler/src/output/output_ast';

@Component({
  selector: 'app-lesson7',
  templateUrl: './lesson7.component.html',
  styleUrls: ['./lesson7.component.scss']
})
export class Lesson7Component implements OnInit {

  constructor() { }

  ngOnInit() {
  }
// 匹配整数或者小数（包括正数和负数） 20 -20, -111.222222,1.2
  str1 = '';
  test1() {
    const reg = /^-?\d+(\.\d+)?$/;
    return reg.test(this.str1);
  }
  // 匹配年月日日期 格式2018-01-0   01-09 1-9   10 11 12     01-09 10-29 30 31
  str2 = '';
  test2() {
    const reg = /^\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|30|31)$/;
    return reg.test(this.str2);
  }

  // 匹配qq号 6,11位  0
  str3 = '';
  test3() {
    const reg = /^[1-9]\d{5,10}$/;
    return reg.test(this.str3);
  }

  // 匹配11位的手机号  13 15 17 18
  str4 = '';
  test4() {
    const reg = /^1[34578]\d{9}$/;
    return reg.test(this.str4);
  }

  // 匹配邮箱地址  test@abc.sina.com.cn
  str5 = '';
  test5() {
    const reg = /^\w+@\w+\.(\w+\.)?(com|net|org)(\.cn)?$/;
    return reg.test(this.str5);
  }

  // 简单的身份证匹配
  // * 身份证18位编码规则：dddddd yyyymmdd xxx y
  // * dddddd：6位地区编码
  // * yyyymmdd: 出生年(四位年)月日，如：19910215   19-20  01-12  01-31 18
  // * xxx：顺序编码，系统产生，无法确定，奇数为男，偶数为女
  // * y: 校验码，该位数值可通过前17位计算获得(有可能包含X)  
  str6 = '';
  test6() {
    const reg = /^[1-9]\d{5}(19|20)\d{2}(0?[1-9]|1[0-2])(0?[1-9]|[12][0-9]|30|31)\d{3}[\dxX]$/;
    return reg.test(this.str6);
  }

  // 给手机号打马赛克 131****2345
  str8 = '';
  test8() {
    const reg = /^(1[3578]\d)(\d{4})(\d{4})/;
    return this.str8.replace(reg, (...args) => {
      return args[1] +'****'+ args[3];
    });
  }

  // 提取出网址和网名为JSON数据
  str9 = 
`<a href="http://www.wondersgroup.com">万达信息</a>
<a href="http://oa.wondersgroup.com">万达OA</a>
<a href="http://linkup.wondersgroup.com">万达智通</a>`;
  test9() {
    const arr = [];
    const reg = /<a href="(.+)">(.+)<\/a>/g;
    let result;
    while(result = reg.exec(this.str9)) {
      arr.push({
        name: result[2],
        link: result[1]
      });
    }
    return arr;
  }

  // 从类似9-2*5/3+7/3*99/4*2998+10*568/14的表达式中匹配出从左到右第一个乘法或除法
  str10 = '';
  test10() {
  const reg = /\d+[*/]\d+/;
  return this.str10.match(reg);
  }

  // 从下面面算式中匹配出最内层小括号以及小括号内的表达式
  // 1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))
  str11 = '';
  test11() {
    const reg = /\([^()]+\)/g;
    return this.str11.match(reg);
  }

  // 数字千分符，将数字123456789分割成123,456,789
  str12 = '';
  test12() {
    const reg = /\B(?=(\d{3})+$)/g;
    return this.str12.replace(reg, ',');
  }

  // 获取 url 中的参数，并提取hash http://localhost:4200/lesson7?a=1&dfsd=1#abd
  str14 = '';
  test14() {
    const reg = /([^#?&]+)=([^#?&]+)/g;
    let obj = {};
    let result;
    while(result = reg.exec(this.str14)) {
      console.log(result);
      obj[result[1]] = result[2]
    }
    return obj;
  }

  // 密码长度至少为8位最长为20，由字母和数字组成，其中必须包含一个特殊字符，其中字母必须有大写和小写。
  str15 = '';
  test15() {
    const regArrs = [
      /^[\w!@#$%^&*-]{8,20}$/,
      /\d/g,
      /[a-z]/g,
      /[A-Z]/g
    ];
    return regArrs.every(v => v.test(this.str15));
  }

  // 将时间2020-03-20 20:20:20 替换成 2020年03月20日 20时20分20秒
  str16 = '';
  test16() {
    const reg = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
    return this.str16.replace(reg, '$1年$2月$3日 $4时$5分$6秒');
  }

  // 手机号服务商，匹配出手机号服务商  中国电信 189 联通 133 移动 138
  str17 = '';
  test17() {
    const arr = [
      {reg: /^189\d{8}$/, msg: '中国电信'},
      {reg: /^133\d{8}$/, msg: '中国联通'},
      {reg: /^138\d{8}$/, msg: '中国移动'},
      {reg: /^1[38]\d{9}$/, msg: '未知服务商'},
    ];
    const flag = arr.find(v => v.reg.test(this.str17));
    return flag ? flag.msg : '不是手机号码';
  }

  // 简单的模板引擎 动手编写一个简单模板引擎
  str18 = 
`<h6 class="text-danger">{{title}}</h6>
<p class="text-info">{{content}}</p>
`;

  data18 = {
    title: '简单的模板引擎',
    content: '我们现在在学习正则表达式',

  };
  str18Res = ''; // 运算结果
  test18() {
    let str = this.str18;
    const reg = /{{(\w*)}}/g;
    let result;
    while(result = reg.exec(this.str18)) {
      str = str.replace(result[0], `$\{data.${result[1]} || ''\}`);
    }
    console.log(str);
    const fn = new Function(`data`, `return \`${str}\``);
    this.str18Res = fn(this.data18);
  }

  // 断言练习 去除html空格和换行
  str19 = 
`<div class="test"> 
  断言练习 去除html空格和换行
  <div> 我这里又 一个 空格 </div>
<div>
<input type="text" value="这是个input" />
<p id="test"> </p>
`;
  test19() {
    const reg = /(?=[^>]*(?=<))\s/g;
    return this.str19.replace(reg, '');
  }
}
